import { RrwebEventType } from './enum';
import { v4 as uuidv4 } from 'uuid';

// logWorker.js
const EVENT_WINDOW = 30_000; // 30秒窗口
let events = [];
let circularBuffer = [];
let bufferIndex = 0;
const BUFFER_SIZE = 300; // 环形缓冲区大小

const MAX_MEMORY_THRESHOLD = 10 * 1024 * 1024; // 10MB

// 初始化环形缓冲区
const initBuffer = () => {
  circularBuffer = Array.from({ length: BUFFER_SIZE });
  bufferIndex = 0;
};

// 获取有效事件（滑动窗口）
const getValidEvents = () => {
  const now = Date.now();
  const validEvents = [];

  /**
   * bufferIndex 永远指向下一个写入位置，在添加新事件后，bufferIndex 要移动到下一个索引位
   * 这个位置存储的是当前缓冲区中最旧的数据
   * 遍历 (bufferIndex + i) 实际是按存储顺序获取数据
   * 最后的排序保证时间顺序正确
   */
  for (let i = 0; i < BUFFER_SIZE; i++) {
    // 这里 bufferIndex 是自增 1 后的位置，但是由于是环形索引计算，所以，bufferIndex 之前的位置反而是新数据
    const idx = (bufferIndex + i) % BUFFER_SIZE;
    const event = circularBuffer[idx];

    if (event && now - event.timestamp <= EVENT_WINDOW) {
      validEvents.push(event);
    }
  }

  // 按时间排序确保顺序正确
  return validEvents.sort((a, b) => a.timestamp - b.timestamp);
};

// 内存检查函数
const checkMemoryUsage = () => {
  if (performance.memory) {
    const usedMemory = performance.memory.usedJSHeapSize;

    // 当内存超过阈值时清理数据
    if (usedMemory > MAX_MEMORY_THRESHOLD) {
      circularBuffer.slice(-50);
      // 发送内存状态到主线程
      self.postMessage({
        type: 'memoryStatus',
        maxMemory: performance.memory.jsHeapSizeLimit,
      });
    }
    console.log('======');

    self.postMessage({
      type: 'memoryStatus',
      maxMemory: performance.memory.jsHeapSizeLimit,
    });
  }
};

const addEvent = (event) => {
  // 使用环形缓冲区存储最新事件
  circularBuffer[bufferIndex] = {
    ...event,
    uid: uuidv4(),
  };

  // checkMemoryUsage();

  /**
   * 环形计算，当为 100 % 100 = 0，自动将索引归0
   * 这里需要自增 1，让 bufferIndex 在获取数据的时候，始终指向下个索引位
   * 因为环形索引的特性，如果 bufferIndex 不 +1，bufferIndex 及它之前的位置是新数据，并且当前的位置为最新数据
   */
  bufferIndex = (bufferIndex + 1) % BUFFER_SIZE;
  events = getValidEvents(); // 更新线性视图
};

// 查找最近的完整快照
const findNearestSnapshot = () => {
  for (let i = events.length - 1; i >= 0; i--) {
    if (events[i].type === RrwebEventType.FullSnapshot) {
      return i;
    }
  }
  return -1;
};

self.onmessage = ({ data }) => {
  switch (data.type) {
    case 'INIT':
      initBuffer();
      break;

    case 'ADD_EVENT':
      if (data.event) {
        addEvent(data.event);
      }
      break;

    case 'GET_EVENTS':
      const snapshotIndex = findNearestSnapshot();
      const validEvents =
        snapshotIndex >= 0 ? events.slice(snapshotIndex) : [...events]; // 无快照时发送全部
      // console.log(validEvents);

      self.postMessage({
        type: 'EVENTS_RESPONSE',
        requestId: data.requestId,
        events: validEvents,
      });
      break;

    case 'CLEAR':
      initBuffer();
      events = [];
      break;
  }
};
